# 运算符
# 位运算符

def decInt2Bin(string_num):
    num = int(string_num)
    if num < 0:
        num = abs(num) ^ 0xFF -1
    result = bin(num)[2:]  # bin 返回一个十进制整数对应的 以 0b 开头的二进制数[例:3 -> 0b11],因此取[2:]的数
    return result.zfill(8)  # zfill(width) 返回一个 width 位的二进制数(例：3.zfill(8) -> 0000 0011)


a = 60  # bin(60) -> 0b 0011 1100
b = 13  # bin(13) -> 0b 0000 1101

print("a 十进制：", a, "对应的二进制：", decInt2Bin(a))
print("b 十进制：", b, "对应的二进制：", decInt2Bin(b))
print("a按位与b的十进制：", a & b, "对应的二进制：", decInt2Bin(a & b))
print("a按位或b的十进制：", a | b, "对应的二进制：", decInt2Bin(a | b))
print("a按位异或b的十进制：", a ^ b, "对应的二进制：", decInt2Bin(a ^ b))
print("a左移两位的十进制：", a >> 2, "对应的二进制：", decInt2Bin(a >> 2))
print("a右移两位的十进制：", a << 2, "对应的二进制：", decInt2Bin(a << 2))
print("a取反的十进制：", ~a, "对应的二进制：", decInt2Bin(~a))


# 逻辑运算符 and/or/not
# Python中认为:非 0 为 True,0 为 False
a,b = 10,20
if a and b:
    print("a 和 b 都为 True")
else:
    print("a 和 b 有一个不为 True")

if a or b:
    print("a 和 b 有一个为 True")
else:
    print("a 和 b 都不为 True")

a = 0
print("修改 a 的值为:", a)
if a and b:
    print("a 和 b 都为 True")
else:
    print("a 和 b 有一个不为 True")

if a or b:
    print("a 和 b 有一个为 True")
else:
    print("a 和 b 都不为 True")

if not a and b:
    print("a 和 b 都为 True")
else:
    print("a 和 b 有一个不为 True")

# 成员运算符: in/not in
a,b = 10,20
list = [1,3,5,7,9]
if a in list:
    print("变量a在给定的list中")
else:
    print("变量a不在给定的list中")

if b not in list:
    print("变量b不在给定的list中")
else:
    print("变量b在给定的list中")

a = 3
print("修改变量a的值为:",a)
if a in list:
    print("变量a在给定的list中")
else:
    print("变量a不在给定的list中")

# 身份运算符: is/is not
# 用于判断两个对象是否引用自一个地址,即判断两个对象的内存地址是否相等
# 使用 id() 函数获取对象的内存地址
# python 中有一个自带的内存池,数值比较小的值已经在这个内存池中定义好了,因此在创建变量时会直接指向这个内存池中的内存地址
a,b = 10,10
print("a 的地址:", id(a),"b 的地址:", id(b))
print("a 的地址与 b 的地址相等", id(a) == id(b))
print("a 的地址与 b 的地址相等", a is b)
b = 20
print("a 的地址:", id(a),"b 的地址:", id(b))
print("a 的地址与 b 的地址不相等", a is not b)

# is 比较的是变量的内存地址,==比较的是变量的值
a = [1,2,3]
b = a # 浅拷贝(拷贝了list的地址和变量)
print(b is a) # 地址相同
print(b == a) # list中的值也相等
b = a[:] # 深拷贝(只拷贝了变量)
print(b is a) # 地址不同
print(b == a) # 元素值相等
print(5.0 / 3.0)
print(5.0 // 3.0) # 整除